#include "multistart.h"
#include <limits.h>
//TEST
   #include <cstdlib> 
   #include <ctime> 
//ENDTEST

      /**
       * Constructor por defecto
       * */
       MultiStart::MultiStart(){}

   
      /** Constructor
       * @param listado de los rectángulos a empaquetar
       * */
       MultiStart::MultiStart(list<Rectangulo> lista) : Heuristica (lista) {

       }

       

      ///** Generar solución inicial 
       //* En esta clase base simplemente se meten en orden
       //* */
      list<Rectangulo>  MultiStart::generaInicial() {
         reiniciaSolucion();
         list<Rectangulo>::iterator it = candidatos.begin();         
         int size = candidatos.size();

         for(int i = 0; i < size ; i++) {
            it = candidatos.begin();
            int suma = rand()%candidatos.size();
            for (int j = 0; j < suma; j++) 
               it++;
            aSolucion(it);
         }
         
         muestraCandidatos();
         muestraSolucion();
         
         return solucion;
      }


      /**
      * Mejorar solución
      * En esta clase base se seleccionan aleatoriamente
      * */
      list<Rectangulo> MultiStart::mejoraSolucion() {
         if (iteracion % (N_BUSQUEDAS_LOCALES + 1) == 0) { //Multistart
            list<Rectangulo>::iterator it = candidatos.begin();
            reiniciaSolucion();
            int size = candidatos.size();
            srand((unsigned)time(0));
            for(int i = 0; i < size ; i++) {
               it = candidatos.begin();
               int suma = rand()%candidatos.size();
               for (int j = 0; j < suma; j++) 
                  it++;
               aSolucion(it);
            }
         } else { //búsqueda local
            //cout << "BUSQUEDA LOCAL" << endl;
            int giros = iteracion % N_BUSQUEDAS_LOCALES;
            list<Rectangulo>::iterator it = solucion.end();
            it--;            
            for (int i = 0; i < giros; i++) {
               it->rotar();
               it--;
            }
         }
 
         
         return solucion;
      }


     

      
      MultiStart::~MultiStart() {

	  }
